﻿// B. Rock and Lever.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1420/B

达尼克急需石头和杠杆！显然，最简单的办法就是向隐士蜥蜴要这些东西。

隐士蜥蜴同意给达尼克杠杆。但是要想得到石头，达尼克需要完成下面的任务。

给你一个正整数 n 和一个正整数数组 a。任务是计算 i<j 且 ai & aj≥ai⊕aj 的数对 (i,j) 的数目，其中 & 表示位操作 AND，⊕ 表示位操作 XOR。

达尼克已经解决了这个任务。但你能解决吗？

输入
每个测试包含多个测试用例。

第一行包含一个正整数 t（1≤t≤10），表示测试用例的数量。测试用例说明如下。

每个测试用例的第一行包含一个正整数 n（1≤n≤105）--数组的长度。

第二行包含 n 个正整数 ai（1≤ai≤109）--数组元素。

保证所有测试用例的 n 之和不超过 105。

输出
为每个测试用例打印一个非负整数 - 问题答案。

InputCopy
5
5
1 4 3 7 10
3
1 1 1
4
6 2 5 3
2
2 4
1
1
OutputCopy
1
3
2
0
0

注释
在第一个测试案例中，只有一对配对：(4,7)：对它来说，4 & 7=4，4⊕7=3。

在第二个测试案例中，所有配对都是好的。

第三个测试案例中有两对：(6,5) 和 (2,3)。

在第四种情况下，没有好的配对。

*/




#include <iostream>
#include <cstring>

using namespace std;

const int N = 100010;
int pre[N][50];
int a[N];
int n, T;

int getidx(int x) {
	int ret = 0;
	while (x) {
		x = x / 2;
		ret++;
	}

	return ret-1;
}



void solve() {
	memset(pre, 0, sizeof pre);
	memset(a, 0, sizeof a);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int t; cin >> t;
		int idx = getidx(t);
		a[i] = t;
		pre[i][idx] = 1;
	}

	//做前缀和
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j <= 35; j++) {
			pre[i][j] = pre[i - 1][j] + pre[i][j];
		}
	}
	long long ans = 0;
	for (int i = 1; i <= n; i++) {
		int idx = getidx(a[i]);
		ans += pre[n][idx] - pre[i ][idx];
	}

	cout << ans << endl;
}


int main()
{
	cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}

 